package com.quanyan.stadium.service.commonComponent;

import com.quanyan.api.APIResponse;
import com.quanyan.club.entity.RespClubActivity;
import com.quanyan.club.entity.RespClubBaseInfo;
import com.quanyan.club.entity.RespClubPlainInfo;
import com.quanyan.club.entity.vo.resp.RespSearchActivity;
import com.quanyan.common.Plugin.PageObj;
import com.quanyan.orderpay.response.RespPayInfo;
import com.quanyan.place.entity.apiresp.RespCity;
import com.quanyan.place.entity.apiresp.RespCityInfos;
import com.quanyan.place.entity.apiresp.RespDistrict;
import com.quanyan.stadium.api.req.ReqLocation;
import com.quanyan.stadium.api.resp.RespStadiumDefaultConfig;
import com.quanyan.stadium.entity.TbGameCommonParameter;
import com.quanyan.stadium.entity.vo.GameBanner;
import com.quanyan.stadium.entity.vo.PlaceInfo;
import com.quanyan.stadium.entity.vo.PlaceUnitInfo;
import com.quanyan.stadium.entity.vo.UserMedal;
import com.quanyan.user.response.RespUserInfoBase;
import com.quanyan.user.response.RespUserInfoDetail;

import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;


/**
 *
 * 该类存放一些公用方法,方便本模块中的方法使用,获取外部模块提供的方法,均从改模块出
 *
 * 此外,该类提供本系统的一些默认配置
 *
 *
 * */

public interface BaseService {
    /**
     *
     *  获取运动场的一些基本配置接口
     * */
    RespStadiumDefaultConfig getStadiumDefaultConfig();

    /**
     * 运动场banner图展示接口
     *
     * */
    APIResponse<List<GameBanner>> gameBanner(Integer cityId, Integer districtId) throws InvocationTargetException, IllegalAccessException;


    /**************以下封装了一些dubbo协议***************/

    /**
     * 根据城市id获取城市信息（支持缓存）
     * @param cityId
     * @return
     */


    RespCity getRespCityById(Integer cityId);

    /**
     * 根据城市id获取区域信息
     * @param cityId
     * @return
     */

    List<RespDistrict> queryDistrictListByCityId(Integer cityId);

    /**
     * 获取所有城市
     *
     * */
    List<RespCityInfos> queryRespCityInfos();

    /**
     * 根据场馆id获取下面可用场地集合
     *
     * */
    APIResponse<?> queryUsablePlaceUnits(Integer placeId);

    /**
     * 根据区域id获取下面的场馆基本对象
     *
     * */
    List<PlaceInfo> queryPlaceInfoByDistrictId(Integer cityId,Integer districtId);

    /**
     * 根据区域id和栏目id获取目标场馆
     *
     * */
    List<PlaceInfo> queryPlaceInfoByDistrictId(Integer cityId,Integer districtId, Integer categoryId);

    Map<Integer, PlaceUnitInfo> queryPlaceUnitInfoMsgList(List<Integer> placeUnitIds);

    Map<Integer, PlaceInfo> queryPlaceInfoMsgList(List<Integer> placeIds);

    /**
     * 根据关键字获取俱乐部的一些基本信息列表 (小球类)
     *
     * */
    PageObj<List<RespClubBaseInfo>> queryClubMsgByKey(String key, Integer cityId, Integer districtId,
                                                      Integer pageNum, Integer pageSize);

    /**
     * 俱乐部id和用户id来判断用户是否加入俱乐部
     *
     * */
    boolean isJoinedClub(Integer clubId, Integer uid);
    /**
     * 俱乐部id集合,获取俱乐部信息集合
     *
     * */
    Map<Integer, RespClubPlainInfo> queryClubMsg(List<Integer> clubs);
    /**
     * 俱乐部id,获取俱乐部信息集合  (已联调)
     *
     * */
    RespClubPlainInfo queryClubMsg(Integer clubId);

    /**
     * 俱乐部id集合,获取俱乐部对应的代表队用户uid集合
     *
     * */
    Map<Integer, List<Integer>> queryClubIds(List<Integer> clubs);
    /**
     * 根据uid获取用户所属俱乐部id集合(代表队\管理员\主席)
     *
     * */
    List<Integer> queryMyClubIds(Integer uid);
    /**
     * 根据uid和栏目id,获取该用户在该栏目下俱乐部个数
     *
     * */
    int queryMyClubNumByCategoryId(Integer uid, Integer categoryId);

    /**
     * 根据uid和栏目id,获取该用户在该栏目下俱乐部个数
     *
     * */
    List<Integer> queryMyClubListByCategoryId(Integer uid, Integer categoryId);

    /**
     * 获取用户基本信息 (已联调)
     *
     * */
    Map<Integer, RespUserInfoBase> queryUserMsg(List<Integer> uIds);

    /**
     * 获取用户基本信息 (已联调)
     *
     * */
    RespUserInfoDetail queryUserMsg(Integer uid);
    /**
     * 获取用户基本信息 (已联调)
     *
     * */
    RespUserInfoBase queryUserMsgByMobile(String mobile);

    /**
     * 获取用户基本信息，如果没有注册则返回null
     * @param mobile
     * @return
     */
    RespUserInfoBase queryUserMsgByPhone(String mobile);


    /**
     * 根据参数的分组信息,获得配置列表
     *
     * */
    List<TbGameCommonParameter> queryTbGameCommonParameterList(String paramGroupKey);

    /**
     * 根据参数的分组key和分组下的具体key获取配置信息
     *
     * */
    TbGameCommonParameter queryTbGameCommonParameter(String paramGroupKey, String paramKey);
    /**
     *  获取俱乐部活动推荐  (废弃)
     */
    @Deprecated
    PageObj<List<RespClubActivity>> queryClubRecommendActivityPageObj();

    /**
     *  获取俱乐部活动推荐
     */
    APIResponse<PageObj<List<RespSearchActivity>>> queryClubRecommendActivity(Integer uid, ReqLocation reqLocation);

    /**
     * 获取勋章列表
     */
    List<UserMedal> getUserMedalList(Integer gameCategoryId,Integer uid,Integer medalNum);

    /**
     * 判断用户是否为有加入过俱乐部
     */
    boolean isSportClubMember(Integer uid,Integer gameCategoryId);

    /**
     * 是否是某种运动类型俱乐部的管理员
     */
    boolean isSportClubAdmin(Integer uid,Integer gameCategoryId);

    /**
     * 我创建的俱乐部Id列表
     */
    List<Integer> getMyManageClubIds(Integer uid);


    /**
     * 该俱乐部的管理员+主席  (包含财务管理员)
     */
    List<Integer> getManageByClubId(Integer clubId);

    /**
     * 获取用户二维码
     */
    String getUserQRCode(Integer uid);

    /**
     * 获取用户二维码
     */
    RespDistrict getRespDistrictByLatAndLng(double lat, double lng);

    /**
     * 获取我加入的(包括我创建的)某种运动类型的俱乐部
     */
    List<Integer> getClubIdsByUid(Integer uid,Integer categoryId);


    /**
     * 获取用户管理的俱乐部
     * */
    List<RespClubPlainInfo> getMyManageClubs(int uid);

    /**
     * 查询支持的支付方式
     */
    List<RespPayInfo> queryPayTypeList();
}
